/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package meu.projeto.dao;

import java.sql.*;
import java.util.*;
import meu.projeto.bean.Dados;

/**
 *
 * @author Matheus
 */
public class DadosDAO {

    private Connection conexao;
    private static Map baseDados = new TreeMap();

    /**
     * Construtor único, para garantir a existência de uma conexão com um SGBD
     *
     * @param conexao Connection já aberta com um SGBD
     */
    public DadosDAO(Connection conexao) {
        this.conexao = conexao;
    }

    public Dados encontraPorCodigo(Integer codigo) {
        return (Dados) baseDados.get(codigo);
    }

    public Collection encontraTodos() {
        return baseDados.values();
    }

    public DadosDAO() {
    }

    /**
     * Se o fornecedor for válido, este método irá fazer o INSERT no SGBD. O
     * Código será inserido pela Sequência e será colocado novamente no objeto
     * fornecedor.
     *
     * @param func Fornecedor a ser inserido
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco
     * será devolvido nesta Exceção
     */
    public void create(Dados func) throws SQLException {
        if (this.valida(func)) {

            String sql = "INSERT INTO dados(codigo, nome, login, senha, email, link, pergunta, resposta, tipo, descricao)"
                    + "VALUES (NEXTVAL('SEQDADOS'), ?, ?, ?, ?, ?, ?, ?, ?, ?)";

            PreparedStatement pst = this.conexao.prepareStatement(sql);
            pst.setString(1, func.getNome());
            pst.setString(2, func.getLogin());
            pst.setString(3, func.getSenha());
            pst.setString(4, func.getEmail());
            pst.setString(5, func.getLink());
            pst.setString(6, func.getPergunta());
            pst.setString(7, func.getResposta());
            pst.setString(8, func.getTipo());
            pst.setString(9, func.getDescricao());

            pst.executeUpdate();

            Statement st = this.conexao.createStatement();
            ResultSet rs = st.executeQuery("SELECT CURRVAL('SEQDADOS')");

            if (rs.next()) {
                func.setCodigo(rs.getInt(1));
            }
            rs.close();
            st.close();
            pst.close();
        }
    }

    /**
     * Retorna o fornecedor do SGBD de acordo com o código do fornecedor
     * recebido.
     *
     * @param dados Fornecedor a ser carregado do SGBD
     * @return Fornecedor do SGBD
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco
     * será devolvido nesta Exceção
     */
    public Dados retrieve(Dados dados) throws SQLException {
        Dados funcRet = null;

        String sql = "SELECT codigo, nome, login, senha, email, link, pergunta, resposta, tipo, descricao FROM dados WHERE codigo=?";

        PreparedStatement pst = this.conexao.prepareStatement(sql);
        pst.setInt(1, dados.getCodigo());

        ResultSet rs = pst.executeQuery();

        if (rs.next()) {

            funcRet = new Dados();

            funcRet.setCodigo(rs.getInt("CODIGO"));
            funcRet.setNome(rs.getString("NOME"));
            funcRet.setLogin(rs.getString("LOGIN"));
            funcRet.setSenha(rs.getString("SENHA"));
            funcRet.setEmail(rs.getString("EMAIL"));
            funcRet.setLink(rs.getString("LINK"));
            funcRet.setPergunta(rs.getString("PERGUNTA"));
            funcRet.setResposta(rs.getString("RESPOSTA"));
            funcRet.setTipo(rs.getString("TIPO"));
            funcRet.setDescricao(rs.getString("DESCRICAO"));
        }
        rs.close();
        pst.close();
        return funcRet;
    }

    /**
     * Atualiza o funcionario no SGBD.
     *
     * @param dados Fornecedor a ser atualizado do SGBD
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco
     * será devolvido nesta Exceção
     */
    public void update(Dados dados) throws SQLException {
        if (this.valida(dados)) {

            String sql = "UPDATE dados SET nome=?, login=?, senha=?, email=?, link=?, pergunta=?, resposta=?, tipo=?, descricao=? WHERE  codigo=?";

            PreparedStatement pst = this.conexao.prepareStatement(sql);


            pst.setString(1, dados.getNome());
            pst.setString(2, dados.getLogin());
            pst.setString(3, dados.getSenha());
            pst.setString(4, dados.getEmail());
            pst.setString(5, dados.getLink());
            pst.setString(6, dados.getPergunta());
            pst.setString(7, dados.getResposta());
            pst.setString(8, dados.getTipo());
            pst.setString(9, dados.getDescricao());
            pst.setInt(10, dados.getCodigo());

            pst.executeUpdate();
            pst.close();
        }
    }

    /**
     * Remove o código do fornecedor do SGBD.
     *
     * @param func Fornecedor a ser excluído. Necessita apenas do atributo COD
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco
     * será devolvido nesta Exceção
     */
    public void delete(Dados func) throws SQLException {
        String sql = "DELETE FROM DADOS WHERE CODIGO = ?";

        PreparedStatement pst = this.conexao.prepareStatement(sql);
        pst.setInt(1, func.getCodigo());
        pst.executeUpdate();
        pst.close();
    }

    /**
     * Retorna uma Lista com todos os Fornecedores cadastrados no SGBD.
     *
     * @return Lista com os fornecedores.
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco
     * será devolvido nesta Exceção
     */
    public List<Dados> listaTodos() throws SQLException {
        List<Dados> lista = new ArrayList<Dados>();

        String sql = "SELECT codigo, nome, login, senha, email, link, pergunta, resposta, tipo, descricao FROM dados ORDER BY codigo";

        Statement st = this.conexao.createStatement();
        ResultSet rs = st.executeQuery(sql);

        while (rs.next()) {
            Dados func = new Dados();
            func.setCodigo(rs.getInt("CODIGO"));
            func.setNome(rs.getString("NOME"));
            func.setLogin(rs.getString("LOGIN"));
            func.setSenha(rs.getString("SENHA"));
            func.setEmail(rs.getString("EMAIL"));
            func.setLink(rs.getString("LINK"));
            func.setPergunta(rs.getString("PERGUNTA"));
            func.setResposta(rs.getString("RESPOSTA"));
            func.setTipo(rs.getString("TIPO"));
            func.setDescricao(rs.getString("DESCRICAO"));

            lista.add(func);
        }
        rs.close();
        st.close();
        return lista;
    }

    public List<Dados> listaTodosNome() throws SQLException {
        List<Dados> lista = new ArrayList<Dados>();

        String sql = "SELECT codigo, nome, login, senha, email, link, pergunta, resposta, tipo, descricao FROM dados ORDER BY nome";

        Statement st = this.conexao.createStatement();
        ResultSet rs = st.executeQuery(sql);

        while (rs.next()) {
            Dados func = new Dados();
            func.setCodigo(rs.getInt("CODIGO"));
            func.setNome(rs.getString("NOME"));
            func.setLogin(rs.getString("LOGIN"));
            func.setSenha(rs.getString("SENHA"));
            func.setEmail(rs.getString("EMAIL"));
            func.setLink(rs.getString("LINK"));
            func.setPergunta(rs.getString("PERGUNTA"));
            func.setResposta(rs.getString("RESPOSTA"));
            func.setTipo(rs.getString("TIPO"));
            func.setDescricao(rs.getString("DESCRICAO"));

            lista.add(func);
        }
        rs.close();
        st.close();
        return lista;
    }

    public List<Dados> listaTodosLogin() throws SQLException {
        List<Dados> lista = new ArrayList<Dados>();

        String sql = "SELECT codigo, nome, login, senha, email, link, pergunta, resposta, tipo, descricao FROM dados ORDER BY login";

        Statement st = this.conexao.createStatement();
        ResultSet rs = st.executeQuery(sql);

        while (rs.next()) {
            Dados func = new Dados();
            func.setCodigo(rs.getInt("CODIGO"));
            func.setNome(rs.getString("NOME"));
            func.setLogin(rs.getString("LOGIN"));
            func.setSenha(rs.getString("SENHA"));
            func.setEmail(rs.getString("EMAIL"));
            func.setLink(rs.getString("LINK"));
            func.setPergunta(rs.getString("PERGUNTA"));
            func.setResposta(rs.getString("RESPOSTA"));
            func.setTipo(rs.getString("TIPO"));
            func.setDescricao(rs.getString("DESCRICAO"));

            lista.add(func);
        }
        rs.close();
        st.close();
        return lista;
    }

    public List<Dados> listaTodosTipo() throws SQLException {
        List<Dados> lista = new ArrayList<Dados>();

        String sql = "SELECT codigo, nome, login, senha, email, link, pergunta, resposta, tipo, descricao FROM dados ORDER BY tipo";

        Statement st = this.conexao.createStatement();
        ResultSet rs = st.executeQuery(sql);

        while (rs.next()) {
            Dados func = new Dados();
            func.setCodigo(rs.getInt("CODIGO"));
            func.setNome(rs.getString("NOME"));
            func.setLogin(rs.getString("LOGIN"));
            func.setSenha(rs.getString("SENHA"));
            func.setEmail(rs.getString("EMAIL"));
            func.setLink(rs.getString("LINK"));
            func.setPergunta(rs.getString("PERGUNTA"));
            func.setResposta(rs.getString("RESPOSTA"));
            func.setTipo(rs.getString("TIPO"));
            func.setDescricao(rs.getString("DESCRICAO"));

            lista.add(func);
        }
        rs.close();
        st.close();
        return lista;
    }

    /**
     * Aplica os testes para as regras de negócio.
     *
     * @param func Fornecedor a ser testado
     * @return true se o Fornecedor atende as regras de negócio, ou false em
     * caso contrário.
     */
    public boolean valida(Dados func) {
        boolean ret = false;
        if (func != null) {
            ret = true;
        }
        return ret;
    }
}
